package com.pronosticnews.client.admin.view.editChampionnat;

import java.io.IOException;
import java.util.List;

import com.google.gwt.core.shared.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.text.shared.Renderer;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FileUpload;
import com.google.gwt.user.client.ui.FormPanel;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent;
import com.google.gwt.user.client.ui.FormPanel.SubmitCompleteHandler;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ValueListBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.pronosticnews.client.admin.resources.PronosticnewsAdminMessages;
import com.pronosticnews.client.admin.resources.PronosticnewsAdminResources;
import com.pronosticnews.shared.model.ChampionnatDto;
import com.pronosticnews.shared.model.PaysDto;
import com.pronosticnews.shared.model.SportDto;

public class EditChampionnatViewImpl extends Composite implements
		EditChampionnatView {

	interface EditChampionnatUiBinder extends
			UiBinder<Widget, EditChampionnatViewImpl> {
	}

	private Presenter presenter;

	@UiField(provided = true)
	ValueListBox<PaysDto> lstPays = new ValueListBox<PaysDto>(
			new Renderer<PaysDto>() {

				@Override
				public String render(PaysDto pays) {
					return pays.getNom();
				}

				@Override
				public void render(PaysDto object, Appendable appendable)
						throws IOException {
				}
			});

	@UiField(provided = true)
	ValueListBox<SportDto> lstSport = new ValueListBox<SportDto>(
			new Renderer<SportDto>() {

				@Override
				public String render(SportDto sport) {
					return sport.getNom();
				}

				@Override
				public void render(SportDto sport, Appendable appendable)
						throws IOException {
				}
			});

	@UiField
	TextBox txtImage;

	@UiField
	Image imgLogo;

	@UiField
	FormPanel form;

	@UiField
	FileUpload uplImage;

	@UiField
	TextBox txtNom;

	@UiField
	Label lblTitle;

	@UiField
	HorizontalPanel panNouveau;

	@UiField
	HorizontalPanel panModifier;

	@UiField
	VerticalPanel containerForm;

	@UiField(provided = true)
	PronosticnewsAdminResources res;

	PronosticnewsAdminMessages messages;

	private ChampionnatDto editChampionnat;

	private final Integer logoSize = 100;

	public EditChampionnatViewImpl() {
		messages = GWT.create(PronosticnewsAdminMessages.class);
		res = GWT.create(PronosticnewsAdminResources.class);
		res.cssFormEdition().ensureInjected();
		initWidget(GWT.<EditChampionnatUiBinder> create(
				EditChampionnatUiBinder.class).createAndBindUi(this));
		lblTitle.addStyleName(res.cssFormEdition().title_creation());
		initForm();
	}

	private void initForm() {
		form.setAction(com.google.gwt.core.client.GWT.getHostPageBaseURL()+"image/");
		form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
			@Override
			public void onSubmitComplete(SubmitCompleteEvent event) {
				try {
					Integer idImage = Integer.parseInt(event.getResults().replace("<pre>", "").replace("</pre>", ""));
					if (idImage != null) {
						editChampionnat.setLogo(idImage);
					}
					presenter.submit(editChampionnat);
				} catch (Exception e) {
				}
			}
		});
	}

	@Override
	public void setPresenter(Presenter presenter) {
		this.presenter = presenter;
	}

	@Override
	public void submitComplete() {
		clearFormulaire();
	}

	private void clearFormulaire() {
		imgLogo.setVisible(false);
		txtImage.setText("");
		txtImage.setValue("");
		txtNom.setValue("");
	}

	@Override
	public void setChampionnat(ChampionnatDto existingChampionnat) {
		if (existingChampionnat.getLogo() != null) {
			txtImage.setText(existingChampionnat.getLogo().toString());
			imgLogo.setUrl(com.google.gwt.core.client.GWT.getHostPageBaseURL()+"image/?id=" + existingChampionnat.getLogo()+"&height="+logoSize );
			imgLogo.setVisible(true);
		}
		txtNom.setText(existingChampionnat.getNom());
		lstPays.setValue(existingChampionnat.getPays());
		lstSport.setValue(existingChampionnat.getSport());
	}

	@Override
	public void setModeModification(boolean mode) {
		panNouveau.setVisible(!mode);
		panModifier.setVisible(mode);
		clearFormulaire();
		if (mode) {
			lblTitle.setText(messages.modifier_championnat());
			lblTitle.addStyleName(res.cssFormEdition().title_modif());
			lblTitle.removeStyleName(res.cssFormEdition().title_creation());
		} else {
			lblTitle.setText(messages.enregistrer_championnat());
			lblTitle.addStyleName(res.cssFormEdition().title_creation());
			lblTitle.removeStyleName(res.cssFormEdition().title_modif());
		}
	}

	@UiHandler("refreshPays")
	void onClickRefreshPays(ClickEvent event) {
		presenter.getPays();
	}

	@UiHandler("refreshSport")
	void onClickRefreshSport(ClickEvent event) {
		presenter.getSports();
	}

	@UiHandler({ "btEnregistrer", "btModifier" })
	void onClick(ClickEvent event) {
		editChampionnat = new ChampionnatDto();
		editChampionnat.setNom(txtNom.getValue());
		editChampionnat.setPays(lstPays.getValue());
		editChampionnat.setSport(lstSport.getValue());
		if (!"".equals(uplImage.getFilename())) {
			form.submit();
		} else {
			presenter.submit(editChampionnat);
		}
		setModeModification(false);
	}

	@UiHandler("btAnnuler")
	void doClickAnnuler(ClickEvent event) {
		setModeModification(false);
		presenter.annuleModification();
	}

	@Override
	public void setPays(List<PaysDto> pays) {
		for (PaysDto paysDto : pays) {
			lstPays.setValue(paysDto);
		}
	}

	@Override
	public void setSport(List<SportDto> sports) {
		for (SportDto sportDto : sports) {
			lstSport.setValue(sportDto);
		}
	}

}
